// 单调队列优化具体步骤
// 加入所需元素：向单调队列重复加入元素直到当前元素达到所求区间的右边界，这样就能保证所需元素都在单调队列中。
// 弹出越界队首：单调队列本质上是维护的是所有已插入元素的最值，但我们想要的往往是一个区间最值。于是我们弹出在左边界外的元素，以保证单调队列中的元素都在所求区间中。
// 获取最值：直接取队首作为答案即可。、
int que[N];//手写deque
int hh = 0, tt = 0;
for(int i = 1; i <= n; i++)
{
    if(hh <= tt && i - m > que[hh]) hh++;//已在队列里的，不符合区间条件的元素弹出
    dp[i] = max(dp[i - 1],g(que[hh]) + s[i]);//转移方程
    while(hh <= tt && (g(que[tt]) <= g(i))) tt--;//弹出不如新插入元素的
    que[++tt] = i;//新加入的符合条件的元素进入
}

